#ifndef CHINACTPTRADER_H
#define CHINACTPTRADER_H

#include <QObject>
#include "chinactp/ThostFtdcTraderApi.h"

class ChinaCtpTrader: public QObject,public CThostFtdcTraderSpi
{
public:
    // 会话参数
    TThostFtdcFrontIDType	trade_front_id;	//前置编号
    TThostFtdcSessionIDType	session_id;	//会话编号

    explicit ChinaCtpTrader(
        CThostFtdcTraderApi *api,
        TThostFtdcBrokerIDType brokerID,
        TThostFtdcInvestorIDType investerID,     // 投资者账户名
        TThostFtdcPasswordType investerPassword, // 投资者密码
        TThostFtdcAppIDType appID,     // 投资者账户名
        TThostFtdcAuthCodeType authCode, // 投资者密码
        QObject *parent = nullptr
    );
    ///当客户端与交易后台建立起通信连接时（还未登录前），该方法被调用。

    ///认证响应
    void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///登录请求响应
    void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///错误应答
    void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///当客户端与交易后台通信连接断开时，该方法被调用。当发生这个情况后，API会自动重新连接，客户端可不做处理。
    void OnFrontDisconnected(int nReason) override;

    ///心跳超时警告。当长时间未收到报文时，该方法被调用。
    void OnHeartBeatWarning(int nTimeLapse) override;

    ///登出请求响应
    void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///投资者结算结果确认响应
    void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///请求查询合约响应
    void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///请求查询资金账户响应
    void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///请求查询投资者持仓响应
    void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///报单录入请求响应
    void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///报单操作请求响应
    void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) override;

    ///报单通知
    void OnRtnOrder(CThostFtdcOrderField *pOrder) override;

    ///成交通知
    void OnRtnTrade(CThostFtdcTradeField *pTrade) override;

signals:
    // 自定义信号，用于向 Qt 主线程传递数据
    void connected();
    void disconnected(int reason);
    void loginResult(bool success, const QString &msg);
    void tradeDataReceived(const QString &instrumentID, double lastPrice, double askPrice,double bidPrice); // 成交数据信号
    void OnFrontConnected() override;
    // ---- 自定义函数 ---- //
public:
    bool loginFlag; // 登陆成功的标识
    void reqOrderInsert(        
        TThostFtdcOrderRefType orderRef,
        TThostFtdcExchangeIDType exchangeID,
        TThostFtdcInstrumentIDType instrumentID,
        TThostFtdcPriceType price,
        TThostFtdcVolumeType volume,bool isCloseOrder,bool isBuyOrder,bool isTodayOrder = false); // 个性化报单录入，外部调用private:
    void reqAuthenticate();// 客户认证
    void reqUserLogin(); // 登录请求
    void reqUserLogout(); // 登出请求
    void reqSettlementInfoConfirm(); // 投资者结果确认
    void reqQueryInstrument(); // 请求查询合约
    void reqQueryTradingAccount(); // 请求查询资金帐户
    void reqQueryInvestorPosition(); // 请求查询投资者持仓

    void reqOrderAction(TThostFtdcInstrumentIDType instrumentID,const QString revokeOrderID); // 请求报单操作
    bool isErrorRspInfo(CThostFtdcRspInfoField *pRspInfo); // 是否收到错误信息
    bool isMyOrder(CThostFtdcOrderField *pOrder); // 是否我的报单回报
    bool isTradingOrder(CThostFtdcOrderField *pOrder); // 是否正在交易的报单

private:
    CThostFtdcTraderApi *g_pTradeUserApi;  // API 实例

    TThostFtdcBrokerIDType gBrokerID = "";         // 模拟经纪商代码
    TThostFtdcInvestorIDType gInvesterID = "";     // 投资者账户名
    TThostFtdcPasswordType gInvesterPassword = ""; // 投资者密码
    TThostFtdcAppIDType gAppID = "";     // 投资者账户名
    TThostFtdcAuthCodeType gAuthCode = ""; // 投资者密码

};

#endif // CHINACTPTRADER_H
